package main

import "fmt"

func add(a interface{}){
	b := a.(int)  // 只有做了类型转换，才能做下面的加法
	b++
	c := a
	fmt.Printf("%T %v\n", c, c)  // 虽然能打印出类型，但是代码层面这个的类型还是interface{}
	//c++  // 这句还不能执行，现在c的类型是interface{}，只有数值类型能做加法
}

func main() {
	var i int = 10  // 这个是int
	var j interface{}  // 这个是空接口
	fmt.Printf("%T %v\n", j, j)  // 还没给j赋值，现在j只是一个空指针，默认类型和默认值都是nil
	j = i  // 任何类型都可以给空接口赋值，如果i是参数传入的，现在并不知道i的类型
	fmt.Printf("%T %v\n", j, j)  // 可以打印查看现在的j的类型和值都是和i一样的，但是代码层面还是不知道具体类型
	res := j.(int)  // 转成int类型，如果不是int类型会报错
	//res := j.(int32)  // 转成int32，由于类型不对，会报错
	fmt.Printf("%T %v\n", res, res)

	add(100)
}